package com.cskaoyan.javase.oop3._3inner._2static._2basic;

/**
 * 先明确两点:
 * 1.外围类和静态内部类还是好兄弟,互相访问成员,不受访问权限限制.
 * 2.静态内部类对象和外围类对象没有任何关系,不会互相依赖
 *      成员内部类对象会持有外围类对象的引用,作为成员变量
 *      但是静态内部类对象不会持有外围类对象的引用,如果想要互相访问,都必须创建对方的对象
 *      怎么创建呢?
 *      直接new就完事了,new出对象后,直接对象名访问成员即可.
 *
 * 静态内部类的访问特点，主要从以下几个角度研究：
 * 1. 静态内部类内部访问外围类
 *      成员方法: 都是直接new对象
 *      静态方法: 都是直接new对象
 *      创建对象后直接访问,不受权限的限制
 *
 * 2. 外围类访问静态内部类成员
 *       成员方法: 都是直接new对象
 *       静态方法: 都是直接new对象
 *       创建对象后直接访问,不受权限的限制
 * 3. 外部类访问静态内部类成员
 *      也是直接创建对象
 *      但是注意要受访问权限限制
 *
 * 4. 静态内部类访问外部类成员
 *      也是直接创建对象
 *      但是注意要受访问权限限制
 *
 * @since 10:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 直接创建静态内部类对象
        EnclosedClazz.NestedClazz ecnc = new EnclosedClazz.NestedClazz();
        // System.out.println(ecnc.b);

        Student s = new Student();
        // Student s = new Demo().new Student();

    }

    public void test() {

    }

    static class Student {
    }
}

class EnclosedClazz {
    int a;
    private int b = 100;
    static int c = 200;
    static final int D = 300;

    void testEnclosed() {
        NestedClazz nc = new NestedClazz();
        System.out.println(a);
        System.out.println(b);
    }

    static void testEnclosedStatic() {
        NestedClazz nc = new NestedClazz();
        EnclosedClazz ec = new EnclosedClazz();
    }

    // 静态内部类
    static class NestedClazz {
        int a;
        private int b = 10;
        static int c = 20;
        static final int D = 30;

        void test(int a) {
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.a);
            System.out.println(ec.b);
            System.out.println(this.a);
            System.out.println(b);
            System.out.println(EnclosedClazz.c);
            System.out.println(NestedClazz.c);
        }

        static void testStatic() {
            EnclosedClazz ec = new EnclosedClazz();
            NestedClazz nc = new NestedClazz();
        }

        public NestedClazz() {
        }

        public NestedClazz(int a, int b) {
            this.a = a;
            this.b = b;
        }
    }
}
